//package org.summerframework.security.core.interceptor;
//
//import org.apache.commons.lang3.StringUtils;
//import org.springframework.web.bind.ServletRequestUtils;
//import org.springframework.web.method.HandlerMethod;
//
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//
///**
// * @author 石超
// * @version v1.0.0
// */
//public class SynchronizedInterceptor extends AbstractHandlerInterceptorAdapter {
//    private final static JedisPool JEDIS_POOL = CachePool.getInstance().getJedisPool();
//
//    @Override
//    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
//        try (Jedis jedis = JEDIS_POOL.getResource()) {
//            if (!(handler instanceof HandlerMethod)) {
//                return true;
//            }
//
//            HandlerMethod handlerMethod = (HandlerMethod) handler;
//            String key = handlerMethod.getBean().getClass().getName() + handlerMethod.getMethod().toString();
//            Synchronized aSynchronized = findAnnotation(handlerMethod, Synchronized.class);
//
//            if (aSynchronized != null)
//                acquire(key, aSynchronized.lockKey(), ServletRequestUtils.getStringParameter(request, aSynchronized.lockParam(), ""), aSynchronized.timeout());
//
//            return true;
//        }
//    }
//
//
//    /**
//     * 获取锁
//     *
//     * @param key   锁名称  key与string互斥,  String优先
//     * @param param 锁的参数
//     */
//    public void acquire(String key, String param) {
//        acquire(key, null, param, 60 * 1000);
//    }
//
//    /**
//     * 获取锁
//     *
//     * @param string 多个锁的名称
//     * @param param  锁的参数
//     */
//    public void acquire(String[] string, String param) {
//        acquire(null, string, param, 60 * 1000);
//    }
//
//    /**
//     * 获取锁
//     *
//     * @param key     锁名称  key与string互斥,  String优先
//     * @param param   锁的参数
//     * @param timeout 超时
//     */
//    public void acquire(String key, String param, int timeout) {
//        acquire(key, null, param, timeout);
//    }
//
//    /**
//     * 获取锁
//     *
//     * @param string  多个锁的名称
//     * @param param   锁的参数
//     * @param timeout 超时
//     */
//    public void acquire(String[] string, String param, int timeout) {
//        acquire(null, string, param, timeout);
//    }
//
//    /**
//     * 获取锁
//     *
//     * @param key     锁名称  key与string互斥,  String优先
//     * @param string  多个锁的名称
//     * @param param   锁的参数
//     * @param timeout 超时
//     */
//    private void acquire(String key, String[] string, String param, int timeout) {
//        try (Jedis jedis = JEDIS_POOL.getResource()) {
//            if (string != null && string.length != 0) {
//                for (String lockKey : string) {
//                    JedisLock jedisLock = new JedisLock(jedis, lockKey + ":" + param, timeout);
//                    jedisLock.acquire();
//                }
//            } else if (StringUtils.isNotBlank(key)) {
//                JedisLock jedisLock = new JedisLock(jedis, key + ":" + param, timeout);
//                jedisLock.acquire();
//            }
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * 释放锁
//     *
//     * @param key   锁名称  key与string互斥,  String优先
//     * @param param 锁的参数
//     */
//    public void release(String key, String param) {
//        release(key, null, param);
//    }
//
//    /**
//     * 释放锁
//     *
//     * @param string 多个锁的名称
//     * @param param  锁的参数
//     */
//    public void release(String[] string, String param) {
//        release(null, string, param);
//    }
//
//    /**
//     * 释放锁
//     *
//     * @param key    锁名称  key与string互斥,  String优先
//     * @param string 多个锁的名称
//     * @param param  锁的参数
//     */
//    public void release(String key, String[] string, String param) {
//        try (Jedis jedis = JEDIS_POOL.getResource()) {
//            if (string != null && string.length != 0) {
//                for (String lockKey : string) {
//                    JedisLock jedisLock = new JedisLock(jedis, lockKey + ":" + param);
//                    jedisLock.release();
//                }
//            } else if (StringUtils.isNotBlank(key)) {
//                JedisLock jedisLock = new JedisLock(jedis, key + ":" + param);
//                jedisLock.release();
//            }
//        }
//    }
//
//    @Override
//    public void afterCompletion(
//            HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
//        if (!(handler instanceof HandlerMethod)) {
//            return;
//        }
//
//        HandlerMethod handlerMethod = (HandlerMethod) handler;
//        String key = handlerMethod.getBean().getClass().getName() + handlerMethod.getMethod().toString();
//        Synchronized aSynchronized = findAnnotation(handlerMethod, Synchronized.class);
//
//        if (aSynchronized != null)
//            release(key, aSynchronized.lockKey(), ServletRequestUtils.getStringParameter(request, aSynchronized.lockParam(), ""));
//    }
//}
